package com.atguigu.boot.config;

import ch.qos.logback.core.db.DBHelper;
import com.atguigu.boot.bean.Car;
import com.atguigu.boot.bean.Pet;
import com.atguigu.boot.bean.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;

/**
 * 1.配置类里面使用@Bean标注在方法上给容器注册组件，默认也是单例的。
 * 2.配置类也是组件
 * 3.proxyBeanMethods 代理bean方法
 * Full(proxyBeanMethods = true)
 * Lite(proxyBeanMethods = false)
 * 组件依赖
 * 4.{User.class, DBHelper.class}
 * 给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名
 * 5.@ImportResource("classpath:beans.xml")导入xml配置文件，让他生效
 */
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = true)//告诉springboot这是一个配置类==配置文件
@ImportResource("classpath:beans.xml")
@EnableConfigurationProperties(Car.class)
//1.开启Car的属性配置功能
//2.把Car这个组件自动注册到容器中
public class MyConfig {
    //给容器中添加组件，以方法名作为组件的id，返回类型就是组件类型
//    返回值就是组件在容器中的实例

    /**
     * 外部无论对配置类中的这个组件注册方法调用多少次，获取的都是之前注册容器中的单例对象
     * @return
     */
    @ConditionalOnBean(name="tom")//容器中有tom组件的时候，下面的才生效,这个注解可以用在类上
    @Bean
    public User user01(){
        User zhangsan = new User("zhangsan",17);
//        user组件依赖了Pet组件
       zhangsan.setPet(tomcatPet());
        return zhangsan;
    }
//    @Bean("tomxxx")//把组件的id改成了tomxxx
    @Bean("tom22")
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }
}
